﻿using FBroSharp.Callback;
using FBroSharp.Const;
using FBroSharp.Event;
using FBroSharp.Lib;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace 拦截获取简单实例
{

    public class FBroResponseFilterEvent : FBroSharpResponseFilterEvent
    {
        //用于保存当前处理的资源地址
        public string url = "";

        //用于存放全部数据

        public List<byte> buffer = new List<byte>();


        public void Start(long flag)
        {
        }

        //获取结束
        public void End(long flag)
        {
            byte[] data = buffer.ToArray();

            if (data != null && data.Length > 0)
            {

                string path = Directory.GetCurrentDirectory() + "\\temp\\";

                //不要太长
                if (url.Length > 120)
                    url = url.Substring(0, 120);
            
                //舍却？后面的
                int point = url.IndexOf("?");
                if (point > 0)
                    url = url.Substring(0, point);

                //将链接当作文件名，踢出无法做文件名的符号
                string filename = url.Replace("/", "%");
                filename = filename.Replace(":", ";");

                //判断文件夹是否存在，不存在则重新创建
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                //将数据保存到文件中，当然你也可以不用这么处理
                FileStream fs = new FileStream(path + filename, FileMode.OpenOrCreate);
                fs.Write(data, 0, data.Length);
                fs.Close();
            }
        }


        public FBroSharpResponseFilterStatus Filter(long flag, byte[] data_in, ulong data_in_size, out byte[] data_out, ulong data_out_size)
        {

            //将数据保存到list，循环变量的方式，这里估计可能效率有点慢
            //当然你用可以用其他方式保存，但都要注意数据超过data_out_size这里是多数获取
            for (int i = 0; i < data_in.Length; i++)
            {
                buffer.Add(data_in[i]);
            }

            //输出数据置空，不修改当前数据，如果要修改注意修改数据不能大于data_out_size，
            //如要超过data_out_size只能返回RESPONSE_FILTER_NEED_MORE_DATA，下次再处理一直到处理完data_in_size < data_out_size
            data_out = null;

            if (data_in_size > data_out_size)
            {//输入数据大于最大输出数据，数据还未读完，还要继续读取
                return FBroSharpResponseFilterStatus.RESPONSE_FILTER_NEED_MORE_DATA;
            }
            else
            {//输入数据小于最大输出数据，本次数据读完，不需要继续处理
                return FBroSharpResponseFilterStatus.RESPONSE_FILTER_DONE;
            }
        }

        public bool InitFilter(long flag)
        {
            //返回真开始拦击
            return true;
        }


    }

}
